package com.datasure.repository.base;

import com.datasure.domain.entity.base.Entity;
import com.datasure.types.Identifier;

import javax.validation.constraints.NotNull;

/**
 * @author zhangxiaolong
 * @ClassName Repository.java
 * @Description 基础存储接口
 * @createTime 2022年01月13日 11:39:00
 */
public interface Repository<T extends Entity<ID>, ID extends Identifier> { 
    
    /**
     * 将一个Entity附属到一个Repository，让它变为可追踪。
     * Change-Tracking在下文会讲，非必须
     */
    void attach(@NotNull T entity);

    /**
     * 解除一个Entity的追踪
     * Change-Tracking在下文会讲，非必须
     */
    void detach(@NotNull T entity);

    /**
     * 通过ID寻找Entity。
     * 找到的Entity自动是可追踪的
     */
    T find(@NotNull ID id);

    /**
     * 将一个Entity从Repository移除
     * 操作后的entity对象自动取消追踪
     */
    void remove(@NotNull T entity);

    /**
     * 保存一个Entity
     * 保存后自动重置追踪条件
     */
    void save(@NotNull T entity);
}
